package com.wjw.java.collection.generic;

/**
 * Java泛型:
 *
 * 1.声明：
 * interface 接口名<T> 和 class类<K,V>{
 *
 * }
 * 其中T、K、V代表的是元素的类型,而非值,使用任意字母都行,常用T,代表Type类型
 *
 * 2.细节:
 * T、K、V...只能是引用类型,再指定泛型具体类型后,可以传入该类型或其子类
 * List list = new ArrayList();默认给的泛型就是<E>,E就是Object类型
 */
public class Generic_ {
    public static void main(String[] args) {
        Person<String> p1 = new Person<>("你好啊");//此时E为String类型
        Person<Integer> p2 = new Person<>(123);//此时E为Integer类型
        Person<Double> p3 = new Person<>(666.888);//此时E为Double类型
        System.out.println(p1);
        p1.showEType();
        System.out.println(p2);
        p2.showEType();
        System.out.println(p3);
        p3.showEType();
    }
}
//泛型的作用：可以在类声明时,通过一个标识,表示类中某个属性的类型
class Person<E>{

    E e;//该属性的类型根据<E>的类型来确定,E是什么类型,该属性就是类型

    public Person(E e) {//E可以为参数类型
        this.e = e;
    }

    public E getE() {//E可以为返回值类型
        return this.e;
    }

    public void showEType(){
        String typeName = e.getClass().getTypeName();
        System.out.println(typeName);

    }

    @Override
    public String toString() {
        return "Person{" +
                "e=" + e +
                '}';
    }
}
